package sas

import (
	"fmt"

	"github.com/micro-plat/lib4go/security/des"
	"github.com/micro-plat/lib4go/security/padding"
	"github.com/micro-plat/lib4go/types"
)

//Encrypt 加密数据
//mode 加密类型/填充模式,不传默认为:CBC/pkcs5
func (n *sasClient) DESEncrypt(input types.XMap, mode ...string) (data types.XMap, err error) {
	//获取密钥
	res, err := n.SecretGet(DESStr)
	if err != nil {
		return nil, err
	}

	return n.desEncrypt(input, res.AesSecret, mode...)
}

//Encrypt 加密数据
func (n *sasClient) desEncrypt(input types.XMap, key string, mode ...string) (data types.XMap, err error) {
	//如果没有需要加解密的字段  直接返回原来的
	data = input
	if len(n.encryptName) == 0 {
		return
	}

	nmode := types.GetStringByIndex(mode, 0, fmt.Sprintf("%s/%s", des.DesCBC, padding.PaddingPkcs5))
	for _, v := range n.encryptName {
		if input.Has(v) && input.GetString(v) != "" {
			crypted, err := des.Encrypt(input.GetString(v), key, nmode)
			if err != nil {
				return nil, err
			}
			data[v] = crypted
		}
	}
	return
}

//Decrypt 解密数据
//mode 加密类型/填充模式,不传默认为:CBC/pkcs5
func (n *sasClient) DESDecrypt(input types.XMap, mode ...string) (data types.XMap, err error) {
	//获取密钥
	res, err := n.SecretGet(DESStr)
	if err != nil {
		return nil, err
	}

	return n.desDecrypt(input, res.DesSecret, mode...)
}

//Decrypt 解密数据
func (n *sasClient) desDecrypt(input types.XMap, key string, mode ...string) (data types.XMap, err error) {
	//如果没有需要加解密的字段  直接返回原来的
	data = input
	if len(n.encryptName) == 0 {
		return
	}

	nmode := types.GetStringByIndex(mode, 0, fmt.Sprintf("%s/%s", des.DesCBC, padding.PaddingPkcs5))
	for _, v := range n.encryptName {
		if input.Has(v) && input.GetString(v) != "" {
			origData, err := des.Decrypt(input.GetString(v), key, nmode)
			if err != nil {
				return nil, err
			}
			data[v] = origData
		}
	}
	return
}
